/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.dei.unipd.healthservice.servlet;

import it.dei.unipd.healthservice.database.CategoriaDatabase;
import it.dei.unipd.healthservice.database.CreateProdottoDatabase;
import it.dei.unipd.healthservice.resource.Categoria;
import it.dei.unipd.healthservice.resource.Prodotto;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import java.io.*;

/**
 * Servlet per l'inserimento di un prodotto nel DB.
 * 
 * @author Simone Zennaro
 * @version 1.00
 */

public class CreateProdottoServlet extends AbstractDatabaseServlet {

	/**
	 * Crea un nuovo prodotto.
	 * 
	 * @param req
	 *            la richiesta ricevuta dal client.
	 * @param res
	 *            la rispota fornita dal server.
	 * 
	 * @throws ServletException
	 *             se ci sono problemi nell'esecuzione della servlet.
	 * @throws IOException
	 *             se ci sono problemi nella comunicazione client-server.
	 */
	public void doGet(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		doPost(req,res);
	}
	
	/**
	 * Crea un nuovo prodotto.
	 * 
	 * @param req
	 *            la richiesta ricevuta dal client.
	 * @param res
	 *            la rispota fornita dal server.
	 * 
	 * @throws ServletException
	 *             se ci sono problemi nell'esecuzione della servlet.
	 * @throws IOException
	 *             se ci sono problemi nella comunicazione client-server.
	 */
	public void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		Connection con = null;
		// imposta il tipo MIME della risposta
		res.setContentType("text/html");

		// ottiene un flusso di uscita per scrivere la risposta
		PrintWriter out = res.getWriter();
		String azione = "";
		try{
			
			azione = (String) req.getParameter("action");
			if(azione == null)
				azione="";
		}catch(Exception e){azione="";}
		
		if (azione.equals("pre")) { // se non devo salvare il nuovo
												// prodotto preparo la pagina
												// per farlo
			try {
				con = DS.getConnection();
				CategoriaDatabase cd = new CategoriaDatabase(con);
				ArrayList<Categoria> categorie = cd.getCategorie();

				req.setAttribute("categorie", categorie);

			}
			catch (NullPointerException e) {
				out.printf("<p><center><font color=\"red\" size=\"+2\">Impossibile creare la connessione al database.</font></center></p>");
			}
			catch (SQLException e) {
				out.printf(
						"<p><center><font color=\"red\" size=\"+2\">Errore durante l'accesso al database: %s</font></center></p>",
						e.getMessage());
			}

			String address = "/jsp/create_prodotto.jsp";
			RequestDispatcher dispatcher = req.getRequestDispatcher(address);
			dispatcher.forward(req, res);
		}
		else 
		{
			String filePath = getServletContext().getInitParameter("file-upload");

			String nome = null;// =req.getParameter("nome");
			String immagine = null;// = req.getParameter("immagine");
			boolean aRichiesta = false;// =
										// Boolean.parseBoolean(req.getParameter("aRichiesta"));
			float prezzo = 0;// =Float.parseFloat(req.getParameter("prezzo"));
			String descrizione = null;// = req.getParameter("descrizione");
			String categoriaNome = null;// = req.getParameter("categoriaNome");

			// boolean isMultipartContent =
			// ServletFileUpload.isMultipartContent(req);
			FileItemFactory factory = new DiskFileItemFactory();
			ServletFileUpload upload = new ServletFileUpload(factory);
			try {
				List<FileItem> fields = upload.parseRequest(req);
				out.println("Numero campi:" + fields.size());
				// Iterator<FileItem> it = fields.iterator();
				int i = 0;
				for (FileItem fileItem : fields)
				{

					boolean isFormField = fileItem.isFormField();
					if (isFormField) {

						if (fileItem.getFieldName().equals("nome")) {
							nome = fileItem.getString();
						}
						if (fileItem.getFieldName().equals("aRichiesta")) {
							aRichiesta = Boolean.parseBoolean(fileItem.getString());
						}
						if (fileItem.getFieldName().equals("prezzo")) {
							prezzo = Float.parseFloat(fileItem.getString());
						}
						if (fileItem.getFieldName().equals("descrizione")) {
							descrizione = fileItem.getString();
						}
						if (fileItem.getFieldName().equals("categoriaNome")) {
							categoriaNome = fileItem.getString();
						}
					} else {

						String fileName = fileItem.getName();

						immagine = fileName;
						File file = new File(filePath + fileName);

						fileItem.write(file);
						out.println("file scritto con successo in:" + filePath
								+ fileName);
					}

				}
			} 
			catch (Exception ex){ out.println(ex); }

			Prodotto prodotto = new Prodotto(nome, immagine, aRichiesta,
					prezzo, descrizione, categoriaNome);
            out.printf(""+nome+" "+immagine+" "+descrizione+" "+prezzo+" "+descrizione+" "+categoriaNome);

			try {
				con = DS.getConnection();

				new CreateProdottoDatabase(con, prodotto).createProdotto();
				req.setAttribute("prodotto", prodotto);
				String address = "/jsp/index_fabbrica.jsp";
				RequestDispatcher dispatcher = req.getRequestDispatcher(address);
				dispatcher.forward(req, res);

			}
			catch (NullPointerException ex) {
				out.printf("<p><center><font color=\"red\" size=\"+2\">Impossibile creare la connessione al database.</font></center></p>");
			}
			catch (SQLException ex) {
				out.printf(
						"<p><center><font color=\"red\" size=\"+2\">Errore durante l'accesso al database: %s</font></center></p>",
						ex.getMessage());
			}
		}


		// assicura che tutto il contenuto sia inviato
		out.flush();

		// chiude il flusso di uscita
		out.close();

	}


}
